13-2 峇峓傿c}C

在結構陣列中,我們可以使用「句點」(”.”)來存取某一筆資料內的某一個特定欄位值,例如 student(2).name 就是第二位學生的姓名,student(3).scores(2) 就是第三位學生的第二次小考成績,依此類推。請看下列範例:

Example 1: 13-結構陣列/accessStructData01.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); student(2).name='Alex'; % 改變第二位學生的姓名 disp(student(2)); % 顯示第二位學生的資料 student(3).scores(2)=100; % 改變第三位學生的第二次小考成績 disp(student(3)); % 顯示第三位學生的資料 name: 'Alex' scores: [80 85 90 88] name: 'Betty' scores: [88 100 90 80]

如果欄位名稱是一個變數,我們同樣也可以使用句點來取得相關的欄位值,在下列範例中,我們使用一個變數 fieldName 來定義欄位,並列印此欄位的值,範例如下:

Example 2: 13-結構陣列/accessStructData02.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); fieldName='name'; for i=1:length(student) fprintf('%d: Value of %s is %s\n', i, fieldName, student(i).(fieldName)); end 1: Value of name is Banny 2: Value of name is Joey 3: Value of name is Betty

MATLAB 提供了 cat 指令,以達到「並排欄位值」的目的,其語法為:

A = cat(dim, structureField)

其中,dim 代表並排後所改變的維度。例如

範例如下:

Example 3: 13-結構陣列/structCat01.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); score1 = cat(1, student.scores) % 1 代表上下並排以改變橫列的維度 score2 = cat(2, student.scores) % 2 代表左右並排以改變直行的維度 score1 = 85 80 92 78 80 85 90 88 88 82 90 80 score2 = 85 80 92 78 80 85 90 88 88 82 90 80

在進行「並排」時,必須確認被並排的欄位值有相同的行數(上下並排)或列數(左右並排),否則就會因為維度不和而產生錯誤訊息。例如,欲將 student 變數的 name 欄位進行上下並排,就會發生錯誤,請試試看:cat(1, student.name)。

依照上例,我們就可以很快地計算平均分數,如下:

Example 4: 13-結構陣列/structAverage01.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); scoreMat = cat(1, student.scores); % 1 代表上下並排以改變橫列的維度 average1=mean(scoreMat); fprintf('四次小考的全班平均:'); disp(average1); average2=mean(scoreMat'); fprintf('三位學生的小考平均:'); disp(average2); 四次小考的全班平均: 84.3333 82.3333 90.6667 82.0000 三位學生的小考平均: 83.7500 85.7500 85.0000

Hint
「mean(A')」完全等於 「mean(A, 2)'」,請試看看!」

由於「並排運算」常被用到,所以 MATLAB 又提供下列兩種方法來進行欄位值的並排:

範例如下:

Example 5: 13-結構陣列/structLeftRightCat01.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); scoreMat = cat(1, student.scores); % 1 代表上下並排以改變橫列的維度 fprintf('成績左右並排:'); disp([student.scores]) fprintf('姓名左右並排:'); disp({student.name})成績左右並排: 85 80 92 78 80 85 90 88 88 82 90 80 姓名左右並排: 'Banny' 'Joey' 'Betty'

上述的 cat 指令及方括弧、大括弧運算等都是 MATLAB 的內建指令,其運算速度很快。但若您要求的運算無法使用上述指令來達成,只好就使用速度較慢的 for 迴圈了!舉例來說,若要印出每位學生的名字,可輸入如下:

Example 6: 13-結構陣列/structPrint01.mclear student % 清除 student 變數 student(1) = struct('name', '張庭碩', 'scores', [85, 80]); student(2) = struct('name', '鍾書蓉', 'scores', [80, 85]); student(3) = struct('name', '黃念中', 'scores', [88, 82]); for i = 1:length(student) % 列印出每個學生的名字 fprintf ('student %g: %s\n', i, student(i).name); end student 1: 張庭碩 student 2: 鍾書蓉 student 3: 黃念中

除此之外,亦可用 getfield 及 setfield 來取得及改變一個欄位的資料,其指令使用格式如下:

fieldValues = getfield(structureArray, {arrayIndex}, field, {fieldIndex})
newStructure = setfield(structureArray, {arrayIndex}, field,{fieldIndex})

例如,若欲取得第二位學生的第一次小考成績,下列兩種寫法都可以:

若欲將第二位學生的第一次小考成績改為 100 分,下列兩種寫法也都可以:

若欲一次設定多個欄位值,可用 deal 指令,例如:

Example 7: 13-結構陣列/structDeal01.mmyStruct = struct('name', {'Tim', 'Annie'}, 'age', {10, 13}); [myStruct.name] = deal('Roger', 'Jack'); fprintf('myStruct(1).name = %s\n', myStruct(1).name); fprintf('myStruct(2).name = %s\n', myStruct(2).name);myStruct(1).name = Roger myStruct(2).name = Jack

欲取用結構陣列中所有元素內所有欄位的資料,可用 struct2cell 指令,例如:

Example 8: 13-結構陣列/getStructData01.mclear student % 清除 student 變數 student(1) = struct('name', 'Banny', 'scores', [85,80,92,78]); student(2) = struct('name', 'Joey', 'scores', [80,85,90,88]); student(3) = struct('name', 'Betty', 'scores', [88,82,90,80]); values = struct2cell(student) values(:,:,1) = 'Banny' [1x4 double] values(:,:,2) = 'Joey' [1x4 double] values(:,:,3) = 'Betty' [1x4 double]

請注意在上例中,傳回的 values 是一個異質陣列,在本書的前一章有相關的介紹。一般而言,若輸入 struct2cell 指令的結構變數維度為 m×n,且包含 p 個欄位,則傳回異質陣列的維度為 p×m×n。(在上例中,p = 2,m = 1, n = 3。)


MATLAB程式設計:入門篇